package Controlador;

import java.util.List;
import java.util.Map;

import Entidades.Preco;
import Entidades.Venda;
import Entidades.Vendedor;

public abstract class Comissoes implements IComissoes{
	protected double valorComissao;
	protected double valorVenda;
	protected int quantidadeVendas;
	private Map<String,Vendedor> vendedores;
	
	public Comissoes(Map<String, Vendedor> vendedores) {
		this.vendedores = vendedores;
	}

	protected void zeraValores(){
		valorComissao = 0.0;
		valorVenda = 0.0;
		quantidadeVendas = 1;
	}
	
	protected void percorreListaVendedores(){
		for (Map.Entry<String, Vendedor> vendedor : vendedores.entrySet()) {
			zeraValores();
			percorreListaVendasDoVendedor(vendedor.getValue().getVendas());
			configuraDadosExibidos(vendedor.getValue().getNome(), vendedor.getValue().getCategoria().calcularComissao(valorVenda), valorVenda, quantidadeVendas);
		}
	}
	
	protected abstract void configuraDadosExibidos(String nomeVendedor, double valorComissoes, double valorVendas, int quantidadeVendas);
	
	protected void percorreListaVendasDoVendedor(List<Venda> vendas){
		for(Venda venda : vendas){
			int mesVenda = venda.getData().get(venda.getData().MONTH);
			int anoVenda = venda.getData().get(venda.getData().YEAR);
			if(verificaAnoMesValidos(mesVenda, anoVenda)){
				percorreListaPrecosDoProdutoDaVenda(venda);
			}
		}
	}
	
	protected void percorreListaPrecosDoProdutoDaVenda(Venda venda){
		List<Preco> precos = venda.getProduto().getPrecos();
		for(Preco preco : precos){
			if(verificaAnoMesVingencia(preco.getDataDeVingencia().get(preco.getDataDeVingencia().MONTH), preco.getDataDeVingencia().get(preco.getDataDeVingencia().YEAR), venda.getData().get(venda.getData().MONTH), venda.getData().get(venda.getData().YEAR))){
				valorVenda += venda.getQuantidade()*preco.getPreco();	
				quantidadeVendas++;
			}
		}
	}
	
	protected boolean verificaAnoMesVingencia(int mesPreco, int anoPreco, int mesVenda, int anoVenda){
		if(anoPreco == anoVenda){
			if(mesPreco == mesVenda){
				return true;
			}
		}
		return false;
	}
	
	protected abstract boolean verificaAnoMesValidos(int... argumentos);

	public abstract void obterComissoes(int... argumentos);
}
